Micron Document
🎖️GitЯра🎖️


Displaying Raw • Download

androidApp/src/main/kotlin/org/meshtastic/app/MainActivity.kt fff95f98db169fca3a5422a141273a0e83e1a968 (fff95f98) Text, 17.85 KB

T8b949e/*
* Copyright (c) 2026 Meshtastic LLC
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
Tff7b72package T7ee787org.meshtastic.app

Tff7b72import T7ee787android.app.PendingIntent
Tff7b72import T7ee787android.app.TaskStackBuilder
Tff7b72import T7ee787android.content.Intent
Tff7b72import T7ee787android.graphics.Color
Tff7b72import T7ee787android.hardware.usb.UsbManager
Tff7b72import T7ee787android.net.Uri
Tff7b72import T7ee787android.nfc.NdefMessage
Tff7b72import T7ee787android.nfc.NfcAdapter
Tff7b72import T7ee787android.os.Build
Tff7b72import T7ee787android.os.Bundle
Tff7b72import T7ee787android.view.WindowManager
Tff7b72import T7ee787androidx.activity.SystemBarStyle
Tff7b72import T7ee787androidx.activity.compose.ReportDrawnWhen
Tff7b72import T7ee787androidx.activity.compose.setContent
Tff7b72import T7ee787androidx.activity.enableEdgeToEdge
Tff7b72import T7ee787androidx.appcompat.app.AppCompatActivity
Tff7b72import T7ee787androidx.appcompat.app.AppCompatDelegate
Tff7b72import T7ee787androidx.compose.foundation.isSystemInDarkTheme
Tff7b72import T7ee787androidx.compose.runtime.Composable
Tff7b72import T7ee787androidx.compose.runtime.CompositionLocalProvider
Tff7b72import T7ee787androidx.compose.runtime.getValue
Tff7b72import T7ee787androidx.compose.runtime.remember
Tff7b72import T7ee787androidx.core.content.IntentCompat
Tff7b72import T7ee787androidx.core.net.toUri
Tff7b72import T7ee787androidx.core.splashscreen.SplashScreen.Companion.installSplashScreen
Tff7b72import T7ee787androidx.lifecycle.compose.collectAsStateWithLifecycle
Tff7b72import T7ee787androidx.lifecycle.lifecycleScope
Tff7b72import T7ee787co.touchlab.kermit.Logger
Tff7b72import T7ee787com.eygraber.uri.toKmpUri
Tff7b72import T7ee787kotlinx.coroutines.launch
Tff7b72import T7ee787org.koin.android.ext.android.inject
Tff7b72import T7ee787org.koin.androidx.viewmodel.ext.android.viewModel
Tff7b72import T7ee787org.koin.compose.koinInject
Tff7b72import T7ee787org.koin.compose.viewmodel.koinViewModel
Tff7b72import T7ee787org.koin.core.parameter.parametersOf
Tff7b72import T7ee787org.meshtastic.app.intro.AnalyticsIntro
Tff7b72import T7ee787org.meshtastic.app.map.getMapViewProvider
Tff7b72import T7ee787org.meshtastic.app.map.sitePlannerAvailable
Tff7b72import T7ee787org.meshtastic.app.node.component.InlineMap
Tff7b72import T7ee787org.meshtastic.app.node.metrics.getTracerouteMapOverlayInsets
Tff7b72import T7ee787org.meshtastic.app.ui.MainScreen
Tff7b72import T7ee787org.meshtastic.core.barcode.rememberBarcodeScanner
Tff7b72import T7ee787org.meshtastic.core.navigation.DEEP_LINK_BASE_URI
Tff7b72import T7ee787org.meshtastic.core.network.repository.UsbRepository
Tff7b72import T7ee787org.meshtastic.core.nfc.NfcScannerEffect
Tff7b72import T7ee787org.meshtastic.core.nfc.NfcWriterEffect
Tff7b72import T7ee787org.meshtastic.core.resources.Res
Tff7b72import T7ee787org.meshtastic.core.resources.channel_invalid
Tff7b72import T7ee787org.meshtastic.core.service.MeshService
Tff7b72import T7ee787org.meshtastic.core.service.ServiceStartTrigger
Tff7b72import T7ee787org.meshtastic.core.service.startService
Tff7b72import T7ee787org.meshtastic.core.ui.theme.AppTheme
Tff7b72import T7ee787org.meshtastic.core.ui.theme.EventFontResolver
Tff7b72import T7ee787org.meshtastic.core.ui.theme.EventTheme
Tff7b72import T7ee787org.meshtastic.core.ui.theme.EventThemeToggle
Tff7b72import T7ee787org.meshtastic.core.ui.theme.LocalEventTheme
Tff7b72import T7ee787org.meshtastic.core.ui.theme.LocalEventThemeToggle
Tff7b72import T7ee787org.meshtastic.core.ui.theme.MODE_DYNAMIC
Tff7b72import T7ee787org.meshtastic.core.ui.util.LocalAnalyticsIntroProvider
Tff7b72import T7ee787org.meshtastic.core.ui.util.LocalBarcodeScannerProvider
Tff7b72import T7ee787org.meshtastic.core.ui.util.LocalBarcodeScannerSupported
Tff7b72import T7ee787org.meshtastic.core.ui.util.LocalDiscoveryMapProvider
Tff7b72import T7ee787org.meshtastic.core.ui.util.LocalEventBranding
Tff7b72import T7ee787org.meshtastic.core.ui.util.LocalInlineMapProvider
Tff7b72import T7ee787org.meshtastic.core.ui.util.LocalMapMainScreenProvider
Tff7b72import T7ee787org.meshtastic.core.ui.util.LocalMapViewProvider
Tff7b72import T7ee787org.meshtastic.core.ui.util.LocalNfcScannerProvider
Tff7b72import T7ee787org.meshtastic.core.ui.util.LocalNfcScannerSupported
Tff7b72import T7ee787org.meshtastic.core.ui.util.LocalNfcWriterProvider
Tff7b72import T7ee787org.meshtastic.core.ui.util.LocalNodeMapScreenProvider
Tff7b72import T7ee787org.meshtastic.core.ui.util.LocalNodeTrackMapProvider
Tff7b72import T7ee787org.meshtastic.core.ui.util.LocalSitePlannerAvailable
Tff7b72import T7ee787org.meshtastic.core.ui.util.LocalTracerouteMapOverlayInsetsProvider
Tff7b72import T7ee787org.meshtastic.core.ui.util.LocalTracerouteMapProvider
Tff7b72import T7ee787org.meshtastic.core.ui.util.LocalTracerouteMapScreenProvider
Tff7b72import T7ee787org.meshtastic.core.ui.util.accentColorOrNull
Tff7b72import T7ee787org.meshtastic.core.ui.util.brandHighlightOrNull
Tff7b72import T7ee787org.meshtastic.core.ui.util.brandPalette
Tff7b72import T7ee787org.meshtastic.core.ui.util.showToast
Tff7b72import T7ee787org.meshtastic.core.ui.viewmodel.UIViewModel
Tff7b72import T7ee787org.meshtastic.feature.connections.NO_DEVICE_SELECTED
Tff7b72import T7ee787org.meshtastic.feature.intro.AppIntroductionScreen
Tff7b72import T7ee787org.meshtastic.feature.intro.IntroViewModel
Tff7b72import T7ee787org.meshtastic.feature.map.MapScreen
Tff7b72import T7ee787org.meshtastic.feature.map.SharedMapViewModel
Tff7b72import T7ee787org.meshtastic.feature.map.node.NodeMapViewModel
Tff7b72import T7ee787org.meshtastic.feature.node.metrics.MetricsViewModel
Tff7b72import T7ee787org.meshtastic.feature.node.metrics.TracerouteMapScreen

Tff7b72class T56d364MainActivity Tb4b4b4: Te6edf3AppCompatActivityTb4b4b4(Tb4b4b4) Tb4b4b4{
Tff7b72private Tff7b72val Te6edf3modelTb4b4b4: Te6edf3UIViewModel Tff7b72by Te6edf3viewModelTb4b4b4(Tb4b4b4)

Tff7b72private Tff7b72val Te6edf3usbRepositoryTb4b4b4: Te6edf3UsbRepository Tff7b72by Te6edf3injectTb4b4b4(Tb4b4b4)

Tff7b72override Tff7b72fun Td2a8ffonCreateTb4b4b4(Te6edf3savedInstanceStateTb4b4b4: Te6edf3Bundle?Tb4b4b4) Tb4b4b4{
Te6edf3installSplashScreenTb4b4b4(Tb4b4b4)

Tff7b72superTb4b4b4.Te6edf3onCreateTb4b4b4(Te6edf3savedInstanceStateTb4b4b4)

Tff7b72if Tb4b4b4(Te6edf3BuildConfigTb4b4b4.Te6edf3DEBUG Tff7b72&Tff7b72& Te6edf3intentTb4b4b4.Te6edf3getBooleanExtraTb4b4b4(Te6edf3EXTRA_SKIP_ONBOARDINGTb4b4b4, Tff7b72falseTb4b4b4)Tb4b4b4) Tb4b4b4{
Te6edf3modelTb4b4b4.Te6edf3onAppIntroCompletedTb4b4b4(Tb4b4b4)
Tb4b4b4}

Te6edf3enableEdgeToEdgeTb4b4b4(Tb4b4b4)

T8b949e// Explicitly set the cutout mode to ALWAYS for Android 15+ to satisfy Play Console recommendations.
Tff7b72if Tb4b4b4(Te6edf3BuildTb4b4b4.Te6edf3VERSIONTb4b4b4.Te6edf3SDK_INT Tff7b72>Tff7b72= Te6edf3BuildTb4b4b4.Te6edf3VERSION_CODESTb4b4b4.Te6edf3VANILLA_ICE_CREAMTb4b4b4) Tb4b4b4{
Te6edf3windowTb4b4b4.Te6edf3attributesTb4b4b4.Te6edf3layoutInDisplayCutoutMode Tff7b72=
Te6edf3WindowManagerTb4b4b4.Te6edf3LayoutParamsTb4b4b4.Te6edf3LAYOUT_IN_DISPLAY_CUTOUT_MODE_ALWAYS
Tb4b4b4}

T8b949e// Ensure the navigation bar remains seamless on modern Android versions
Tff7b72if Tb4b4b4(Te6edf3BuildTb4b4b4.Te6edf3VERSIONTb4b4b4.Te6edf3SDK_INT Tff7b72>Tff7b72= Te6edf3BuildTb4b4b4.Te6edf3VERSION_CODESTb4b4b4.Te6edf3QTb4b4b4) Tb4b4b4{
Te6edf3windowTb4b4b4.Te6edf3isNavigationBarContrastEnforced Tff7b72= Tff7b72false
Tb4b4b4}

Te6edf3setContent Tb4b4b4{
Tff7b72val Te6edf3theme Tff7b72by Te6edf3modelTb4b4b4.Te6edf3themeTb4b4b4.Te6edf3collectAsStateWithLifecycleTb4b4b4(Tb4b4b4)
Tff7b72val Te6edf3dynamic Tff7b72= Te6edf3theme Tff7b72=Tff7b72= Te6edf3MODE_DYNAMIC
Tff7b72val Te6edf3dark Tff7b72=
Tff7b72when Tb4b4b4(Te6edf3themeTb4b4b4) Tb4b4b4{
Te6edf3AppCompatDelegateTb4b4b4.Te6edf3MODE_NIGHT_YES Tff7b72-Tff7b72> Tff7b72true
Te6edf3AppCompatDelegateTb4b4b4.Te6edf3MODE_NIGHT_NO Tff7b72-Tff7b72> Tff7b72false
Tff7b72else Tff7b72-Tff7b72> Te6edf3isSystemInDarkThemeTb4b4b4(Tb4b4b4)
Tb4b4b4}

T8b949e// Update system bar style when theme changes
Te6edf3androidxTb4b4b4.Te6edf3composeTb4b4b4.Te6edf3runtimeTb4b4b4.Te6edf3SideEffect Tb4b4b4{
Te6edf3enableEdgeToEdgeTb4b4b4(
Te6edf3statusBarStyle Tff7b72= Te6edf3SystemBarStyleTb4b4b4.Te6edf3autoTb4b4b4(Te6edf3ColorTb4b4b4.Te6edf3TRANSPARENTTb4b4b4, Te6edf3ColorTb4b4b4.Te6edf3TRANSPARENTTb4b4b4) Tb4b4b4{ Te6edf3dark Tb4b4b4}Tb4b4b4,
Te6edf3navigationBarStyle Tff7b72= Te6edf3SystemBarStyleTb4b4b4.Te6edf3autoTb4b4b4(Te6edf3ColorTb4b4b4.Te6edf3TRANSPARENTTb4b4b4, Te6edf3ColorTb4b4b4.Te6edf3TRANSPARENTTb4b4b4) Tb4b4b4{ Te6edf3dark Tb4b4b4}Tb4b4b4,
Tb4b4b4)
Tb4b4b4}

Te6edf3AppCompositionLocals Tb4b4b4{
Te6edf3AppThemeTb4b4b4(Te6edf3dynamicColor Tff7b72= Tff7b72dynamicTb4b4b4, Te6edf3darkTheme Tff7b72= Te6edf3darkTb4b4b4) Tb4b4b4{
Tff7b72val Te6edf3appIntroCompleted Tff7b72by Te6edf3modelTb4b4b4.Te6edf3appIntroCompletedTb4b4b4.Te6edf3collectAsStateWithLifecycleTb4b4b4(Tb4b4b4)

T8b949e// Signal to the system that the initial UI is "fully drawn"
T8b949e// once we've decided whether to show the intro or the main screen.
Te6edf3ReportDrawnWhen Tb4b4b4{ Tff7b72true Tb4b4b4}

Tff7b72if Tb4b4b4(Te6edf3appIntroCompletedTb4b4b4) Tb4b4b4{
Te6edf3MainScreenTb4b4b4(Tb4b4b4)
Tb4b4b4} Tff7b72else Tb4b4b4{
Tff7b72val Te6edf3introViewModel Tff7b72= Te6edf3koinViewModelTff7b72<Te6edf3IntroViewModelTff7b72>Tb4b4b4(Tb4b4b4)
Te6edf3AppIntroductionScreenTb4b4b4(Te6edf3onDone Tff7b72= Tb4b4b4{ Te6edf3modelTb4b4b4.Te6edf3onAppIntroCompletedTb4b4b4(Tb4b4b4) Tb4b4b4}Tb4b4b4, Te6edf3viewModel Tff7b72= Te6edf3introViewModelTb4b4b4)
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}

T8b949e// Listen for new intents (e.g. deep links, NFC) without overriding onNewIntent
Te6edf3addOnNewIntentListener Tb4b4b4{ Te6edf3intent Tff7b72-Tff7b72> Te6edf3handleIntentTb4b4b4(Te6edf3intentTb4b4b4) Tb4b4b4}

Te6edf3handleIntentTb4b4b4(Te6edf3intentTb4b4b4)
Tb4b4b4}

Tff7b72override Tff7b72fun Td2a8ffonStartTb4b4b4(Tb4b4b4) Tb4b4b4{
Tff7b72superTb4b4b4.Te6edf3onStartTb4b4b4(Tb4b4b4)
Te6edf3MeshServiceTb4b4b4.Te6edf3startServiceTb4b4b4(Tff7b72thisTb4b4b4, Te6edf3ServiceStartTriggerTb4b4b4.Te6edf3UserInterfaceTb4b4b4)
Tb4b4b4}

Tff7b72override Tff7b72fun Td2a8ffonResumeTb4b4b4(Tb4b4b4) Tb4b4b4{
Tff7b72superTb4b4b4.Te6edf3onResumeTb4b4b4(Tb4b4b4)
T8b949e// Belt-and-suspenders for the Android 12+ attach-intent quirk: if the activity is
T8b949e// resumed while a USB device is already attached (e.g. process restart, returning
T8b949e// from another app), the manifest-declared attach intent may have already fired
T8b949e// before UsbRepository was constructed. Re-poll deviceList here so the UI reflects
T8b949e// reality without requiring the user to physically replug.
Te6edf3usbRepositoryTb4b4b4.Te6edf3refreshStateTb4b4b4(Tb4b4b4)
Tb4b4b4}

Tf0883e@SuppressTb4b4b4(Ta5d6ff"Ta5d6ffLongMethodTa5d6ff"Tb4b4b4)
Tf0883e@Composable
Tff7b72private Tff7b72fun Td2a8ffAppCompositionLocalsTb4b4b4(Te6edf3contentTb4b4b4: Tf0883e@Composable Tb4b4b4(Tb4b4b4) Tff7b72-Tff7b72> Tffa657UnitTb4b4b4) Tb4b4b4{
Tff7b72val Te6edf3eventEdition Tff7b72by Te6edf3modelTb4b4b4.Te6edf3eventEditionTb4b4b4.Te6edf3collectAsStateWithLifecycleTb4b4b4(Tb4b4b4)
Tff7b72val Te6edf3eventThemeEnabled Tff7b72by Te6edf3modelTb4b4b4.Te6edf3eventThemeEnabledTb4b4b4.Te6edf3collectAsStateWithLifecycleTb4b4b4(Tb4b4b4)
Tff7b72val Te6edf3eventFontResolver Tff7b72= Te6edf3koinInjectTff7b72<Te6edf3EventFontResolverTff7b72>Tb4b4b4(Tb4b4b4)
T8b949e// Resolve the ambient event theme once per edition: an accent wash and brand palette (any flavor) and/or
T8b949e// downloadable fonts (Google flavor only). Applied app-wide only while on event firmware and not opted out.
Tff7b72val Te6edf3eventAccent Tff7b72= Te6edf3eventEditionTff7b72?.Te6edf3accentColorOrNullTb4b4b4(Tb4b4b4)
Tff7b72val Te6edf3eventHighlight Tff7b72= Te6edf3eventEditionTff7b72?.Te6edf3brandHighlightOrNullTb4b4b4(Tb4b4b4)
Tff7b72val Te6edf3eventPalette Tff7b72= Te6edf3rememberTb4b4b4(Te6edf3eventEditionTb4b4b4) Tb4b4b4{ Te6edf3eventEditionTff7b72?.Te6edf3brandPaletteTb4b4b4(Tb4b4b4)Tb4b4b4.Te6edf3orEmptyTb4b4b4(Tb4b4b4) Tb4b4b4}
Tff7b72val Te6edf3resolvedEventFonts Tff7b72=
Te6edf3rememberTb4b4b4(Te6edf3eventEditionTb4b4b4, Te6edf3eventFontResolverTb4b4b4) Tb4b4b4{ Te6edf3eventFontResolverTb4b4b4.Te6edf3resolveTb4b4b4(Te6edf3eventEditionTff7b72?.Te6edf3themeTff7b72?.Te6edf3fontsTb4b4b4) Tb4b4b4}
Te6edf3CompositionLocalProviderTb4b4b4(
Te6edf3LocalEventBranding Te6edf3provides Te6edf3eventEditionTb4b4b4,
Te6edf3LocalEventTheme Te6edf3provides
Tff7b72if Tb4b4b4(Te6edf3eventThemeEnabled Tff7b72&Tff7b72& Te6edf3eventEdition Tff7b72!Tff7b72= Tff7b72nullTb4b4b4) Tb4b4b4{
Te6edf3EventThemeTb4b4b4(
Te6edf3accent Tff7b72= Te6edf3eventAccentTb4b4b4,
Te6edf3highlight Tff7b72= Te6edf3eventHighlightTb4b4b4,
Te6edf3palette Tff7b72= Te6edf3eventPaletteTb4b4b4,
Te6edf3fonts Tff7b72= Te6edf3resolvedEventFontsTb4b4b4,
Tb4b4b4)
Tb4b4b4} Tff7b72else Tb4b4b4{
Tff7b72null
Tb4b4b4}Tb4b4b4,
Te6edf3LocalEventThemeToggle Te6edf3provides
Te6edf3EventThemeToggleTb4b4b4(Te6edf3enabled Tff7b72= Te6edf3eventThemeEnabledTb4b4b4, Te6edf3onChange Tff7b72= Te6edf3modelTff7b72::Te6edf3setEventThemeEnabledTb4b4b4)Tb4b4b4,
Te6edf3LocalBarcodeScannerProvider Te6edf3provides Tb4b4b4{ Te6edf3onResult Tff7b72-Tff7b72> Te6edf3rememberBarcodeScannerTb4b4b4(Te6edf3onResultTb4b4b4) Tb4b4b4}Tb4b4b4,
Te6edf3LocalNfcScannerProvider Te6edf3provides Tb4b4b4{ Te6edf3onResultTb4b4b4, Te6edf3onDisabled Tff7b72-Tff7b72> Te6edf3NfcScannerEffectTb4b4b4(Te6edf3onResultTb4b4b4, Te6edf3onDisabledTb4b4b4) Tb4b4b4}Tb4b4b4,
Te6edf3LocalNfcWriterProvider Te6edf3provides Tb4b4b4{ Te6edf3urlTb4b4b4, Te6edf3onResultTb4b4b4, Te6edf3onDisabled Tff7b72-Tff7b72> Te6edf3NfcWriterEffectTb4b4b4(Te6edf3urlTb4b4b4, Te6edf3onResultTb4b4b4, Te6edf3onDisabledTb4b4b4) Tb4b4b4}Tb4b4b4,
Te6edf3LocalBarcodeScannerSupported Te6edf3provides Tff7b72trueTb4b4b4,
Te6edf3LocalNfcScannerSupported Te6edf3provides Tff7b72trueTb4b4b4,
Te6edf3LocalAnalyticsIntroProvider Te6edf3provides Tb4b4b4{ Te6edf3AnalyticsIntroTb4b4b4(Tb4b4b4) Tb4b4b4}Tb4b4b4,
Te6edf3LocalMapViewProvider Te6edf3provides Te6edf3getMapViewProviderTb4b4b4(Tb4b4b4)Tb4b4b4,
Te6edf3LocalSitePlannerAvailable Te6edf3provides Te6edf3sitePlannerAvailableTb4b4b4(Tb4b4b4)Tb4b4b4,
Te6edf3LocalInlineMapProvider Te6edf3provides Tb4b4b4{ Te6edf3nodeTb4b4b4, Te6edf3modifier Tff7b72-Tff7b72> Te6edf3InlineMapTb4b4b4(Te6edf3nodeTb4b4b4, Te6edf3modifierTb4b4b4) Tb4b4b4}Tb4b4b4,
Te6edf3LocalNodeTrackMapProvider Te6edf3provides
Tb4b4b4{ Te6edf3destNumTb4b4b4, Te6edf3positionsTb4b4b4, Te6edf3modifierTb4b4b4, Te6edf3selectedPositionTimeTb4b4b4, Te6edf3onPositionSelected Tff7b72-Tff7b72>
Te6edf3orgTb4b4b4.Te6edf3meshtasticTb4b4b4.Te6edf3appTb4b4b4.Te6edf3mapTb4b4b4.Te6edf3nodeTb4b4b4.Te6edf3NodeTrackMapTb4b4b4(
Te6edf3destNumTb4b4b4,
Te6edf3positionsTb4b4b4,
Te6edf3modifierTb4b4b4,
Te6edf3selectedPositionTimeTb4b4b4,
Te6edf3onPositionSelectedTb4b4b4,
Tb4b4b4)
Tb4b4b4}Tb4b4b4,
Te6edf3LocalTracerouteMapOverlayInsetsProvider Te6edf3provides Te6edf3getTracerouteMapOverlayInsetsTb4b4b4(Tb4b4b4)Tb4b4b4,
Te6edf3LocalTracerouteMapProvider Te6edf3provides
Tb4b4b4{ Te6edf3overlayTb4b4b4, Te6edf3nodePositionsTb4b4b4, Te6edf3onMappableCountChangedTb4b4b4, Te6edf3modifier Tff7b72-Tff7b72>
Te6edf3orgTb4b4b4.Te6edf3meshtasticTb4b4b4.Te6edf3appTb4b4b4.Te6edf3mapTb4b4b4.Te6edf3tracerouteTb4b4b4.Te6edf3TracerouteMapTb4b4b4(
Te6edf3tracerouteOverlay Tff7b72= Te6edf3overlayTb4b4b4,
Te6edf3tracerouteNodePositions Tff7b72= Te6edf3nodePositionsTb4b4b4,
Te6edf3onMappableCountChanged Tff7b72= Te6edf3onMappableCountChangedTb4b4b4,
Te6edf3modifier Tff7b72= Te6edf3modifierTb4b4b4,
Tb4b4b4)
Tb4b4b4}Tb4b4b4,
Te6edf3LocalDiscoveryMapProvider Te6edf3provides
Tb4b4b4{ Te6edf3userLatTb4b4b4, Te6edf3userLonTb4b4b4, Te6edf3nodesTb4b4b4, Te6edf3modifier Tff7b72-Tff7b72>
Te6edf3orgTb4b4b4.Te6edf3meshtasticTb4b4b4.Te6edf3appTb4b4b4.Te6edf3mapTb4b4b4.Te6edf3discoveryTb4b4b4.Te6edf3DiscoveryMapTb4b4b4(Te6edf3userLatTb4b4b4, Te6edf3userLonTb4b4b4, Te6edf3nodesTb4b4b4, Te6edf3modifierTb4b4b4)
Tb4b4b4}Tb4b4b4,
Te6edf3LocalNodeMapScreenProvider Te6edf3provides
Tb4b4b4{ Te6edf3destNumTb4b4b4, Te6edf3onNavigateUp Tff7b72-Tff7b72>
Tff7b72val Te6edf3vm Tff7b72= Te6edf3koinViewModelTff7b72<Te6edf3NodeMapViewModelTff7b72>Tb4b4b4(Tb4b4b4)
Te6edf3vmTb4b4b4.Te6edf3setDestNumTb4b4b4(Te6edf3destNumTb4b4b4)
Te6edf3orgTb4b4b4.Te6edf3meshtasticTb4b4b4.Te6edf3appTb4b4b4.Te6edf3mapTb4b4b4.Te6edf3nodeTb4b4b4.Te6edf3NodeMapScreenTb4b4b4(Te6edf3vmTb4b4b4, Te6edf3onNavigateUp Tff7b72= Te6edf3onNavigateUpTb4b4b4)
Tb4b4b4}Tb4b4b4,
Te6edf3LocalTracerouteMapScreenProvider Te6edf3provides
Tb4b4b4{ Te6edf3destNumTb4b4b4, Te6edf3requestIdTb4b4b4, Te6edf3logUuidTb4b4b4, Te6edf3onNavigateUp Tff7b72-Tff7b72>
Tff7b72val Te6edf3metricsViewModel Tff7b72= Te6edf3koinViewModelTff7b72<Te6edf3MetricsViewModelTff7b72> Tb4b4b4{ Te6edf3parametersOfTb4b4b4(Te6edf3destNumTb4b4b4) Tb4b4b4}
Te6edf3metricsViewModelTb4b4b4.Te6edf3setNodeIdTb4b4b4(Te6edf3destNumTb4b4b4)

Te6edf3TracerouteMapScreenTb4b4b4(
Te6edf3metricsViewModel Tff7b72= Te6edf3metricsViewModelTb4b4b4,
Te6edf3requestId Tff7b72= Te6edf3requestIdTb4b4b4,
Te6edf3logUuid Tff7b72= Te6edf3logUuidTb4b4b4,
Te6edf3onNavigateUp Tff7b72= Te6edf3onNavigateUpTb4b4b4,
Tb4b4b4)
Tb4b4b4}Tb4b4b4,
Te6edf3LocalMapMainScreenProvider Te6edf3provides
Tb4b4b4{ Te6edf3onClickNodeChipTb4b4b4, Te6edf3navigateToNodeDetailsTb4b4b4, Te6edf3waypointId Tff7b72-Tff7b72>
Tff7b72val Te6edf3viewModel Tff7b72= Te6edf3koinViewModelTff7b72<Te6edf3SharedMapViewModelTff7b72>Tb4b4b4(Tb4b4b4)
Te6edf3MapScreenTb4b4b4(
Te6edf3viewModel Tff7b72= Te6edf3viewModelTb4b4b4,
Te6edf3onClickNodeChip Tff7b72= Te6edf3onClickNodeChipTb4b4b4,
Te6edf3navigateToNodeDetails Tff7b72= Te6edf3navigateToNodeDetailsTb4b4b4,
Te6edf3waypointId Tff7b72= Te6edf3waypointIdTb4b4b4,
Tb4b4b4)
Tb4b4b4}Tb4b4b4,
Te6edf3content Tff7b72= Te6edf3contentTb4b4b4,
Tb4b4b4)
Tb4b4b4}

Tf0883e@SuppressTb4b4b4(Ta5d6ff"Ta5d6ffNestedBlockDepthTa5d6ff"Tb4b4b4)
Tff7b72private Tff7b72fun Td2a8ffhandleIntentTb4b4b4(Te6edf3intentTb4b4b4: Te6edf3IntentTb4b4b4) Tb4b4b4{
Tff7b72val Te6edf3appLinkAction Tff7b72= Te6edf3intentTb4b4b4.Te6edf3action
Tff7b72val Te6edf3appLinkDataTb4b4b4: Te6edf3Uri? Tff7b72= Te6edf3intentTb4b4b4.Te6edf3data

Tff7b72when Tb4b4b4(Te6edf3appLinkActionTb4b4b4) Tb4b4b4{
Te6edf3IntentTb4b4b4.Te6edf3ACTION_VIEW Tff7b72-Tff7b72> Te6edf3handleViewIntentTb4b4b4(Te6edf3appLinkDataTb4b4b4)

Te6edf3NfcAdapterTb4b4b4.Te6edf3ACTION_NDEF_DISCOVERED Tff7b72-Tff7b72> Tb4b4b4{
Tff7b72val Te6edf3rawMessages Tff7b72=
Te6edf3IntentCompatTb4b4b4.Te6edf3getParcelableArrayExtraTb4b4b4(
Te6edf3intentTb4b4b4,
Te6edf3NfcAdapterTb4b4b4.Te6edf3EXTRA_NDEF_MESSAGESTb4b4b4,
Te6edf3NdefMessageTff7b72::Te6edf3classTb4b4b4.Te6edf3javaTb4b4b4,
Tb4b4b4)
Tff7b72if Tb4b4b4(Te6edf3rawMessages Tff7b72!Tff7b72= Tff7b72nullTb4b4b4) Tb4b4b4{
Tff7b72for Tb4b4b4(Te6edf3rawMsg Tff7b72in Te6edf3rawMessagesTb4b4b4) Tb4b4b4{
Tff7b72val Te6edf3msg Tff7b72= Te6edf3rawMsg Tff7b72as Te6edf3NdefMessage
Tff7b72for Tb4b4b4(Te6edf3record Tff7b72in Te6edf3msgTb4b4b4.Te6edf3recordsTb4b4b4) Tb4b4b4{
Te6edf3recordTb4b4b4.Te6edf3toUriTb4b4b4(Tb4b4b4)Tff7b72?.Te6edf3let Tb4b4b4{ Te6edf3handleMeshtasticUriTb4b4b4(Tffa657itTb4b4b4) Tb4b4b4}
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}

Te6edf3UsbManagerTb4b4b4.Te6edf3ACTION_USB_DEVICE_ATTACHED Tff7b72-Tff7b72> Tb4b4b4{
Te6edf3LoggerTb4b4b4.Te6edf3d Tb4b4b4{ Ta5d6ff"Ta5d6ffUSB device attachedTa5d6ff" Tb4b4b4}
T8b949e// Android 12+ delivers ACTION_USB_DEVICE_ATTACHED only to manifest-declared
T8b949e// receivers, so the runtime-registered UsbBroadcastReceiver inside UsbRepository
T8b949e// never sees this event. Forward it explicitly so the serialDevices StateFlow
T8b949e// refreshes and the device shows up in the Connect → Serial tab.
Te6edf3usbRepositoryTb4b4b4.Te6edf3refreshStateTb4b4b4(Tb4b4b4)
Te6edf3showConnectionsPageIfNoDeviceSelectedTb4b4b4(Tb4b4b4)
Tb4b4b4}

Te6edf3IntentTb4b4b4.Te6edf3ACTION_MAIN Tff7b72-Tff7b72> Tb4b4b4{Tb4b4b4}

Te6edf3IntentTb4b4b4.Te6edf3ACTION_SEND Tff7b72-Tff7b72> Te6edf3handleSendIntentTb4b4b4(Te6edf3intentTb4b4b4)

Tff7b72else Tff7b72-Tff7b72> Tb4b4b4{
Te6edf3LoggerTb4b4b4.Te6edf3w Tb4b4b4{ Ta5d6ff"Ta5d6ffUnexpected action Tffd700$Te6edf3appLinkActionTa5d6ff" Tb4b4b4}
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}

Tff7b72private Tff7b72fun Td2a8ffhandleViewIntentTb4b4b4(Te6edf3uriTb4b4b4: Te6edf3Uri?Tb4b4b4) Tb4b4b4{
Tff7b72when Tb4b4b4{
Te6edf3uri Tff7b72=Tff7b72= Tff7b72null Tff7b72-Tff7b72> Tb4b4b4{Tb4b4b4}

T8b949e// A file handed to us via "Open in Meshtastic" (Files, Share Sheet, drag-and-drop) rather than a
T8b949e// meshtastic:// / https deep link — import it as a map overlay.
Te6edf3uriTb4b4b4.Te6edf3scheme Tff7b72=Tff7b72= Ta5d6ff"Ta5d6ffcontentTa5d6ff" Tff7b72|Tff7b72| Te6edf3uriTb4b4b4.Te6edf3scheme Tff7b72=Tff7b72= Ta5d6ff"Ta5d6fffileTa5d6ff" Tff7b72-Tff7b72> Te6edf3importMapFileTb4b4b4(Te6edf3uriTb4b4b4)

Tff7b72else Tff7b72-Tff7b72> Te6edf3handleMeshtasticUriTb4b4b4(Te6edf3uriTb4b4b4)
Tb4b4b4}
Tb4b4b4}

Tff7b72private Tff7b72fun Td2a8ffhandleSendIntentTb4b4b4(Te6edf3intentTb4b4b4: Te6edf3IntentTb4b4b4) Tb4b4b4{
Tff7b72val Te6edf3stream Tff7b72= Te6edf3IntentCompatTb4b4b4.Te6edf3getParcelableExtraTb4b4b4(Te6edf3intentTb4b4b4, Te6edf3IntentTb4b4b4.Te6edf3EXTRA_STREAMTb4b4b4, Te6edf3UriTff7b72::Te6edf3classTb4b4b4.Te6edf3javaTb4b4b4)
Tff7b72val Te6edf3text Tff7b72= Te6edf3intentTb4b4b4.Te6edf3getStringExtraTb4b4b4(Te6edf3IntentTb4b4b4.Te6edf3EXTRA_TEXTTb4b4b4)
Tff7b72when Tb4b4b4{
Te6edf3stream Tff7b72!Tff7b72= Tff7b72null Tff7b72-Tff7b72> Te6edf3importMapFileTb4b4b4(Te6edf3streamTb4b4b4)

T8b949e// shared .geojson/.kml file (e.g. Site Planner)
Te6edf3text Tff7b72!Tff7b72= Tff7b72null Tff7b72-Tff7b72> Te6edf3createShareIntentTb4b4b4(Te6edf3textTb4b4b4)Tb4b4b4.Te6edf3sendTb4b4b4(Tb4b4b4)
Tb4b4b4}
Tb4b4b4}

Tff7b72private Tff7b72fun Td2a8ffhandleMeshtasticUriTb4b4b4(Te6edf3uriTb4b4b4: Te6edf3UriTb4b4b4) Tb4b4b4{
Te6edf3LoggerTb4b4b4.Te6edf3d Tb4b4b4{ Ta5d6ff"Ta5d6ffHandling Meshtastic URI: Tffd700$Te6edf3uriTa5d6ff" Tb4b4b4}

Te6edf3modelTb4b4b4.Te6edf3handleDeepLinkTb4b4b4(Te6edf3uriTb4b4b4.Te6edf3toKmpUriTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4{ Te6edf3lifecycleScopeTb4b4b4.Te6edf3launch Tb4b4b4{ Te6edf3showToastTb4b4b4(Te6edf3ResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3channel_invalidTb4b4b4) Tb4b4b4} Tb4b4b4}
Tb4b4b4}

T8b949e/**
* Hand a map file received via an OS "Open in / Send to Meshtastic" intent to the map, then bring the Map tab
* forward so the imported overlay is visible. Only the Google-flavor map consumes this (see [MapFileImportBus]);
* the read grant on [uri] lives as long as this activity, which is long enough for the map to copy the file in.
*/
Tff7b72private Tff7b72fun Td2a8ffimportMapFileTb4b4b4(Te6edf3uriTb4b4b4: Te6edf3UriTb4b4b4) Tb4b4b4{
Te6edf3LoggerTb4b4b4.Te6edf3d Tb4b4b4{ Ta5d6ff"Ta5d6ffImporting shared map file: Tffd700$Te6edf3uriTa5d6ff" Tb4b4b4}
Te6edf3MapFileImportBusTb4b4b4.Te6edf3pendingTb4b4b4.Te6edf3value Tff7b72= Te6edf3uri
Te6edf3handleMeshtasticUriTb4b4b4(Ta5d6ff"Tffd700$Te6edf3DEEP_LINK_BASE_URITa5d6ff/mapTa5d6ff"Tb4b4b4.Te6edf3toUriTb4b4b4(Tb4b4b4)Tb4b4b4)
Tb4b4b4}

Tff7b72private Tff7b72fun Td2a8ffcreateShareIntentTb4b4b4(Te6edf3messageTb4b4b4: Tffa657StringTb4b4b4)Tb4b4b4: Te6edf3PendingIntent Tb4b4b4{
Tff7b72val Te6edf3deepLink Tff7b72= Ta5d6ff"Tffd700$Te6edf3DEEP_LINK_BASE_URITa5d6ff/share?message=Tffd700$Te6edf3messageTa5d6ff"
Tff7b72val Te6edf3startActivityIntent Tff7b72=
Te6edf3IntentTb4b4b4(Te6edf3IntentTb4b4b4.Te6edf3ACTION_VIEWTb4b4b4, Te6edf3deepLinkTb4b4b4.Te6edf3toUriTb4b4b4(Tb4b4b4)Tb4b4b4, Tff7b72thisTb4b4b4, Te6edf3MainActivityTff7b72::Te6edf3classTb4b4b4.Te6edf3javaTb4b4b4)Tb4b4b4.Te6edf3apply Tb4b4b4{
Te6edf3flags Tff7b72= Te6edf3IntentTb4b4b4.Te6edf3FLAG_ACTIVITY_SINGLE_TOP
Tb4b4b4}

Tff7b72val Te6edf3resultPendingIntentTb4b4b4: Te6edf3PendingIntent? Tff7b72=
Te6edf3TaskStackBuilderTb4b4b4.Te6edf3createTb4b4b4(Tff7b72thisTb4b4b4)Tb4b4b4.Te6edf3run Tb4b4b4{
Te6edf3addNextIntentWithParentStackTb4b4b4(Te6edf3startActivityIntentTb4b4b4)
Te6edf3getPendingIntentTb4b4b4(T79c0ff0Tb4b4b4, Te6edf3PendingIntentTb4b4b4.Te6edf3FLAG_IMMUTABLETb4b4b4)
Tb4b4b4}
Tff7b72return Te6edf3resultPendingIntentTff7b72!!
Tb4b4b4}

Tff7b72private Tff7b72fun Td2a8ffshowConnectionsPageIfNoDeviceSelectedTb4b4b4(Tb4b4b4) Tb4b4b4{
Tff7b72val Te6edf3selectedAddress Tff7b72= Te6edf3modelTb4b4b4.Te6edf3currentDeviceAddressFlowTb4b4b4.Te6edf3value
Tff7b72if Tb4b4b4(Tff7b72!Te6edf3selectedAddressTb4b4b4.Te6edf3isNullOrBlankTb4b4b4(Tb4b4b4) Tff7b72&Tff7b72& Te6edf3selectedAddress Tff7b72!Tff7b72= Te6edf3NO_DEVICE_SELECTEDTb4b4b4) Tff7b72return

Te6edf3handleMeshtasticUriTb4b4b4(Ta5d6ff"Tffd700$Te6edf3DEEP_LINK_BASE_URITa5d6ff/connectionsTa5d6ff"Tb4b4b4.Te6edf3toUriTb4b4b4(Tb4b4b4)Tb4b4b4)
Tb4b4b4}

Tff7b72private Tff7b72companion Tff7b72object Tb4b4b4{
Tff7b72const Tff7b72val Te6edf3EXTRA_SKIP_ONBOARDING Tff7b72= Ta5d6ff"Ta5d6ffskip_onboardingTa5d6ff"
Tb4b4b4}
Tb4b4b4}

Served by rngit 1.5.0 - Generated in 0.09s